const Koa = require('koa')
const koaBody = require('koa-body') // 解析请求体
const path = require('path')
const KoaStatic = require('koa-static')
const error = require('koa-json-error') // 错误处理
const parameter = require('koa-parameter') // 参数校验
const routing = require('./routers') // routing是一个函数
const mongoose = require('mongoose') // mongodb数据库
const {connectionUrl,connectionLocalUrl} = require('./config') // 数据库链接URL
const cors = require('koa2-cors') // 跨域

const app = new Koa()

app.use(cors({
  origin: '*',
  maxAge: 5, //指定本次预检请求的有效期，单位为秒。
  credentials: true, //是否允许发送Cookie
  allowMethods: ['GET', 'POST', 'PUT', 'PATCH','DELETE', 'OPTIONS'], //设置所允许的HTTP请求方法
  allowHeaders: ['Content-Type', 'Authorization', 'Accept'], //设置服务器支持的所有头信息字段
}))
app.use(KoaStatic(path.join(__dirname, '/public/uploads')))

// 链接数据库
mongoose.connect(connectionLocalUrl,{ useNewUrlParser: true,useFindAndModify:false },()=>{
  console.log('链接成功了！')
})

mongoose.connection.on('error',console.error)

// 错误处理
app.use(error({
  postFormat:(e,{stack,...reset})=>{
    // 生产环境不返回堆栈信息
    return process.env.NODE_ENV === 'production' ? reset: {stack,...reset}
  }
}))

app.use(koaBody({
  multipart: true, // 支持文件格式
  formidable: {
    // 设置文件上传目录，上传到本地目录public/uploads
    uploadDir: path.join(__dirname, '/public/uploads'),
    keepExtensions: true // 保留扩展名
  }
}))
// 校验请求体的，所以放在后面
app.use(parameter(app))
routing(app)


app.listen(3000,()=>{
  console.log('start to listen port 3000')
})